<template>
  <view v-if="hasDataScope" class="data-scope-guard">
    <slot />
  </view>
  <view v-else-if="showDenied" class="data-scope-denied">
    <u-empty 
      :icon="require('@/static/images/no-permission.png')"
      text="数据权限不足"
      mode="data"
    >
      <view class="data-scope-denied-content">
        <view class="data-scope-icon">
          <u-icon name="lock" size="48" color="#f56c6c"></u-icon>
        </view>
        <view class="data-scope-title">数据权限不足</view>
        <view class="data-scope-message">
          {{ message || '非物业公司人员不能查看本页面数据，请联系管理员获取相应权限。' }}
        </view>
        <view class="data-scope-info" v-if="dataScopeInfo">
          <u-alert
            :title="dataScopeInfo.scopeDescription"
            type="info"
            :closable="false"
            show-icon
          />
        </view>
        <view class="data-scope-actions">
          <u-button type="primary" @click="contactAdmin" :custom-style="{ marginBottom: '12px' }">
            <u-icon name="chat" size="16" style="margin-right: 4px;"></u-icon>
            联系管理员
          </u-button>
          <u-button @click="goBack" :custom-style="{ marginBottom: '12px' }">
            <u-icon name="arrow-left" size="16" style="margin-right: 4px;"></u-icon>
            返回上一页
          </u-button>
          <u-button @click="goHome">
            <u-icon name="home" size="16" style="margin-right: 4px;"></u-icon>
            返回首页
          </u-button>
        </view>
      </view>
    </u-empty>
  </view>
  <view v-else class="data-scope-guard">
    <!-- 不显示任何内容，静默处理 -->
  </view>
</template>

<script>
/**
 * 移动端数据权限守卫组件
 * @author Wu.Liang
 * @date 2025-07-01
 * @description 专门用于检查用户物业公司数据权限的组件
 */
import { mapState, mapActions } from 'vuex'
import { getDataScopeInfo } from '@/api/property'

export default {
  name: 'DataScopeGuard',
  props: {
    /** 是否显示权限不足提示 */
    showDenied: {
      type: Boolean,
      default: true
    },
    /** 权限不足时的提示信息 */
    message: {
      type: String,
      default: ''
    },
    /** 是否需要物业公司权限 */
    requirePropertyCompany: {
      type: Boolean,
      default: true
    },
    /** 所需社区权限 */
    requiredCommunityIds: {
      type: Array,
      default: () => []
    },
    /** 是否自动刷新权限 */
    autoRefresh: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      dataScopeInfo: null,
      loading: false
    }
  },
  computed: {
    ...mapState('user', ['userInfo', 'userDataScope']),
    
    /**
     * 检查是否有数据权限
     */
    hasDataScope() {
      // 超级管理员拥有所有权限
      if (this.isSuperAdmin()) {
        console.log('DataScopeGuard: 超级管理员权限检查通过')
        return true
      }

      // 检查是否为物业公司人员
      if (this.requirePropertyCompany && !this.isPropertyCompanyUser()) {
        console.log('DataScopeGuard: 用户非物业公司人员')
        return false
      }

      // 检查社区权限
      if (this.requiredCommunityIds.length) {
        const userDataScope = this.getUserDataScope()
        const hasCommunityPermission = this.requiredCommunityIds.some(communityId =>
          userDataScope.communityIds.includes(communityId)
        )
        if (!hasCommunityPermission) {
          console.log('DataScopeGuard: 用户社区权限不足')
          return false
        }
      }

      return true
    }
  },
  mounted() {
    if (this.showDenied) {
      this.fetchDataScopeInfo()
    }
  },
  methods: {
    ...mapActions('user', ['getUserInfo']),
    
    /**
     * 检查是否为超级管理员
     */
    isSuperAdmin() {
      return this.userInfo && this.userInfo.roleCode === 'super_admin'
    },
    
    /**
     * 检查是否为物业公司人员
     */
    isPropertyCompanyUser() {
      return this.userDataScope && this.userDataScope.isPropertyCompanyUser
    },
    
    /**
     * 检查是否为保洁人员
     */
    isCleaningStaff() {
      return this.userInfo && this.userInfo.cleaningStaff === true
    },
    
    /**
     * 检查是否为保洁管理
     */
    isCleaningAdmin() {
      return this.userInfo && this.userInfo.cleaningAdmin === true
    },
    
    /**
     * 检查是否为安保人员
     */
    isSecurityStaff() {
      return this.userInfo && this.userInfo.securityStaff === true
    },
    
    /**
     * 检查是否为安保管理
     */
    isSecurityAdmin() {
      return this.userInfo && this.userInfo.securityAdmin === true
    },
    
    /**
     * 检查是否为停车人员
     */
    isParkingStaff() {
      return this.userInfo && this.userInfo.parkingStaff === true
    },
    
    /**
     * 检查是否为停车管理
     */
    isParkingAdmin() {
      return this.userInfo && this.userInfo.parkingAdmin === true
    },
    
    /**
     * 检查是否为物业人员
     */
    isPropertyStaff() {
      return this.userInfo && this.userInfo.propertyStaff === true
    },
    
    /**
     * 检查是否为物业管理
     */
    isPropertyAdmin() {
      return this.userInfo && this.userInfo.propertyAdmin === true
    },
    
    /**
     * 获取用户数据权限范围
     */
    getUserDataScope() {
      return this.userDataScope || { communityIds: [], propertyCompanyIds: [] }
    },
    
    /**
     * 获取数据权限信息
     */
    async fetchDataScopeInfo() {
      try {
        this.loading = true
        const response = await getDataScopeInfo()
        if (response.code === 200) {
          this.dataScopeInfo = response.data
        }
      } catch (error) {
        console.error('获取数据权限信息失败:', error)
      } finally {
        this.loading = false
      }
    },
    
    /**
     * 联系管理员
     */
    contactAdmin() {
      uni.showToast({
        title: '请联系系统管理员获取物业公司权限',
        icon: 'none',
        duration: 2000
      })
      // 这里可以打开联系管理员的对话框或跳转到联系页面
    },
    
    /**
     * 返回上一页
     */
    goBack() {
      if (getCurrentPages().length > 1) {
        uni.navigateBack()
      } else {
        uni.switchTab({
          url: '/pages/index/index'
        })
      }
    },
    
    /**
     * 返回首页
     */
    goHome() {
      uni.switchTab({
        url: '/pages/index/index'
      })
    },
    
    /**
     * 刷新权限
     */
    refreshPermission() {
      if (this.autoRefresh) {
        this.fetchDataScopeInfo()
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.data-scope-guard {
  width: 100%;
  height: 100%;
}

.data-scope-denied {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 400px;
  padding: 40px 20px;
  
  .data-scope-denied-content {
    text-align: center;
    max-width: 500px;
    
    .data-scope-icon {
      margin-bottom: 16px;
      opacity: 0.8;
    }
    
    .data-scope-title {
      font-size: 24px;
      font-weight: 600;
      color: #303133;
      margin: 0 0 12px 0;
    }
    
    .data-scope-message {
      font-size: 14px;
      color: #606266;
      margin: 0 0 20px 0;
      line-height: 1.6;
    }
    
    .data-scope-info {
      margin: 0 0 24px 0;
    }
    
    .data-scope-actions {
      display: flex;
      flex-direction: column;
      gap: 12px;
      align-items: center;
      
      .u-button {
        width: 100%;
        max-width: 200px;
      }
    }
  }
}

// 响应式设计
@media (max-width: 768px) {
  .data-scope-denied {
    padding: 20px 16px;
    
    .data-scope-denied-content {
      .data-scope-title {
        font-size: 20px;
      }
      
      .data-scope-message {
        font-size: 13px;
      }
    }
  }
}
</style> 